/**
 * Copyright (C) 2025 pony working team
 * SPDX-License-Identifier: MulanPSL-2.0
 */

/* define to prevent recursive inclusion -------------------------------------*/
#ifndef __PONY_MPU60X0_H__
#define __PONY_MPU60X0_H__

/* includes (standard library, system) ---------------------------------------*/
#include <stdint.h>
/* includes (other library) --------------------------------------------------*/
/* includes (project) --------------------------------------------------------*/
/* includes (local) ----------------------------------------------------------*/

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* defines -------------------------------------------------------------------*/

#define MPU60X0_ACCEL_OUT 0x3B
#define MPU60X0_TEMP_OUT  0x41
#define MPU60X0_GYRO_OUT  0x43

#define MPU60X0_ADDRESS_AD0_LOW  0x68   // address pin low (GND)
#define MPU60X0_ADDRESS_AD0_HIGH 0x69   // address pin high (VCC)
#define MPU60X0_DEFAULT_ADDRESS  MPU60X0_ADDRESS_AD0_LOW

/* register */
#define MPU60X0_REG_XG_OFFS_TC         0x00   //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU60X0_REG_YG_OFFS_TC         0x01   //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU60X0_REG_ZG_OFFS_TC         0x02   //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU60X0_REG_X_FINE_GAIN        0x03   //[7:0] X_FINE_GAIN
#define MPU60X0_REG_Y_FINE_GAIN        0x04   //[7:0] Y_FINE_GAIN
#define MPU60X0_REG_Z_FINE_GAIN        0x05   //[7:0] Z_FINE_GAIN
#define MPU60X0_REG_XA_OFFS_H          0x06   //[15:0] XA_OFFS
#define MPU60X0_REG_XA_OFFS_L_TC       0x07
#define MPU60X0_REG_YA_OFFS_H          0x08   //[15:0] YA_OFFS
#define MPU60X0_REG_YA_OFFS_L_TC       0x09
#define MPU60X0_REG_ZA_OFFS_H          0x0A   //[15:0] ZA_OFFS
#define MPU60X0_REG_ZA_OFFS_L_TC       0x0B
#define MPU60X0_REG_SELF_TEST_X        0x0D
#define MPU60X0_REG_SELF_TEST_Y        0x0E
#define MPU60X0_REG_SELF_TEST_Z        0x0F
#define MPU60X0_REG_SELF_TEST_A        0x10
#define MPU60X0_REG_XG_OFFS_USRH       0x13   //[15:0] XG_OFFS_USR
#define MPU60X0_REG_XG_OFFS_USRL       0x14
#define MPU60X0_REG_YG_OFFS_USRH       0x15   //[15:0] YG_OFFS_USR
#define MPU60X0_REG_YG_OFFS_USRL       0x16
#define MPU60X0_REG_ZG_OFFS_USRH       0x17   //[15:0] ZG_OFFS_USR
#define MPU60X0_REG_ZG_OFFS_USRL       0x18
#define MPU60X0_REG_SMPLRT_DIV         0x19
#define MPU60X0_REG_CONFIG             0x1A
#define MPU60X0_REG_GYRO_CONFIG        0x1B
#define MPU60X0_REG_ACCEL_CONFIG       0x1C
#define MPU60X0_REG_FF_THR             0x1D
#define MPU60X0_REG_FF_DUR             0x1E
#define MPU60X0_REG_MOT_THR            0x1F
#define MPU60X0_REG_MOT_DUR            0x20
#define MPU60X0_REG_ZRMOT_THR          0x21
#define MPU60X0_REG_ZRMOT_DUR          0x22
#define MPU60X0_REG_FIFO_EN            0x23
#define MPU60X0_REG_I2C_MST_CTRL       0x24
#define MPU60X0_REG_I2C_SLV0_ADDR      0x25
#define MPU60X0_REG_I2C_SLV0_REG       0x26
#define MPU60X0_REG_I2C_SLV0_CTRL      0x27
#define MPU60X0_REG_I2C_SLV1_ADDR      0x28
#define MPU60X0_REG_I2C_SLV1_REG       0x29
#define MPU60X0_REG_I2C_SLV1_CTRL      0x2A
#define MPU60X0_REG_I2C_SLV2_ADDR      0x2B
#define MPU60X0_REG_I2C_SLV2_REG       0x2C
#define MPU60X0_REG_I2C_SLV2_CTRL      0x2D
#define MPU60X0_REG_I2C_SLV3_ADDR      0x2E
#define MPU60X0_REG_I2C_SLV3_REG       0x2F
#define MPU60X0_REG_I2C_SLV3_CTRL      0x30
#define MPU60X0_REG_I2C_SLV4_ADDR      0x31
#define MPU60X0_REG_I2C_SLV4_REG       0x32
#define MPU60X0_REG_I2C_SLV4_DO        0x33
#define MPU60X0_REG_I2C_SLV4_CTRL      0x34
#define MPU60X0_REG_I2C_SLV4_DI        0x35
#define MPU60X0_REG_I2C_MST_STATUS     0x36
#define MPU60X0_REG_INT_PIN_CFG        0x37
#define MPU60X0_REG_INT_ENABLE         0x38
#define MPU60X0_REG_DMP_INT_STATUS     0x39
#define MPU60X0_REG_INT_STATUS         0x3A
#define MPU60X0_REG_ACCEL_XOUT_H       0x3B
#define MPU60X0_REG_ACCEL_XOUT_L       0x3C
#define MPU60X0_REG_ACCEL_YOUT_H       0x3D
#define MPU60X0_REG_ACCEL_YOUT_L       0x3E
#define MPU60X0_REG_ACCEL_ZOUT_H       0x3F
#define MPU60X0_REG_ACCEL_ZOUT_L       0x40
#define MPU60X0_REG_TEMP_OUT_H         0x41
#define MPU60X0_REG_TEMP_OUT_L         0x42
#define MPU60X0_REG_GYRO_XOUT_H        0x43
#define MPU60X0_REG_GYRO_XOUT_L        0x44
#define MPU60X0_REG_GYRO_YOUT_H        0x45
#define MPU60X0_REG_GYRO_YOUT_L        0x46
#define MPU60X0_REG_GYRO_ZOUT_H        0x47
#define MPU60X0_REG_GYRO_ZOUT_L        0x48
#define MPU60X0_REG_EXT_SENS_DATA_00   0x49
#define MPU60X0_REG_EXT_SENS_DATA_01   0x4A
#define MPU60X0_REG_EXT_SENS_DATA_02   0x4B
#define MPU60X0_REG_EXT_SENS_DATA_03   0x4C
#define MPU60X0_REG_EXT_SENS_DATA_04   0x4D
#define MPU60X0_REG_EXT_SENS_DATA_05   0x4E
#define MPU60X0_REG_EXT_SENS_DATA_06   0x4F
#define MPU60X0_REG_EXT_SENS_DATA_07   0x50
#define MPU60X0_REG_EXT_SENS_DATA_08   0x51
#define MPU60X0_REG_EXT_SENS_DATA_09   0x52
#define MPU60X0_REG_EXT_SENS_DATA_10   0x53
#define MPU60X0_REG_EXT_SENS_DATA_11   0x54
#define MPU60X0_REG_EXT_SENS_DATA_12   0x55
#define MPU60X0_REG_EXT_SENS_DATA_13   0x56
#define MPU60X0_REG_EXT_SENS_DATA_14   0x57
#define MPU60X0_REG_EXT_SENS_DATA_15   0x58
#define MPU60X0_REG_EXT_SENS_DATA_16   0x59
#define MPU60X0_REG_EXT_SENS_DATA_17   0x5A
#define MPU60X0_REG_EXT_SENS_DATA_18   0x5B
#define MPU60X0_REG_EXT_SENS_DATA_19   0x5C
#define MPU60X0_REG_EXT_SENS_DATA_20   0x5D
#define MPU60X0_REG_EXT_SENS_DATA_21   0x5E
#define MPU60X0_REG_EXT_SENS_DATA_22   0x5F
#define MPU60X0_REG_EXT_SENS_DATA_23   0x60
#define MPU60X0_REG_MOT_DETECT_STATUS  0x61
#define MPU60X0_REG_I2C_SLV0_DO        0x63
#define MPU60X0_REG_I2C_SLV1_DO        0x64
#define MPU60X0_REG_I2C_SLV2_DO        0x65
#define MPU60X0_REG_I2C_SLV3_DO        0x66
#define MPU60X0_REG_I2C_MST_DELAY_CTRL 0x67
#define MPU60X0_REG_SIGNAL_PATH_RESET  0x68
#define MPU60X0_REG_MOT_DETECT_CTRL    0x69
#define MPU60X0_REG_USER_CTRL          0x6A
#define MPU60X0_REG_PWR_MGMT_1         0x6B
#define MPU60X0_REG_PWR_MGMT_2         0x6C
#define MPU60X0_REG_BANK_SEL           0x6D
#define MPU60X0_REG_MEM_START_ADDR     0x6E
#define MPU60X0_REG_MEM_R_W            0x6F
#define MPU60X0_REG_DMP_CFG_1          0x70
#define MPU60X0_REG_DMP_CFG_2          0x71
#define MPU60X0_REG_FIFO_COUNTH        0x72
#define MPU60X0_REG_FIFO_COUNTL        0x73
#define MPU60X0_REG_FIFO_R_W           0x74
#define MPU60X0_REG_WHO_AM_I           0x75

/* typedefs ------------------------------------------------------------------*/

/* Accelerometer */
typedef struct mpu60x0_accel {
    int16_t x;
    int16_t y;
    int16_t z;
} mpu60x0_accel_t;

/* Gyroscope */
typedef struct mpu60x0_gyro {
    int16_t x;
    int16_t y;
    int16_t z;
} mpu60x0_gyro_t;

/* macro ---------------------------------------------------------------------*/
/* inlines -------------------------------------------------------------------*/
/* externs -------------------------------------------------------------------*/

extern uint8_t mpu60x0_read_id(void);
extern int mpu60x0_read_accel(mpu60x0_accel_t *accel);
extern int mpu60x0_read_gyro(mpu60x0_gyro_t *gyro);
extern int mpu60x0_read_temp(int16_t *temp);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __PONY_MPU60X0_H__ */
